package nayasis.common.db.manager.etc;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

import nayasis.common.exception.unchecked.DatabaseException;

/**
 * DB 연결시 JDBC 드라이버 클래스를 로딩하는 클래스
 * 
 * @author nayasis
 *
 */
public abstract class DriverManager {
	
	// JDBC 드라이버가 이미 로딩됬는지 판단하기 위한 임시저장소 
	private static Set<String> registeredDriverClassNames = new HashSet<>();
	
	/**
	 * JDBC 드라이버를 로딩한다.
	 * 
	 * ( Class.forName("jdbcDriver") 대신 사용 )
	 * 
	 * @param driverClassName JDBC 드라이버 클래스명
	 */
	public static void registerDriver( String driverClassName ) {
		
		if( registeredDriverClassNames.contains(driverClassName) ) return;

		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        
		try {

			classLoader.loadClass( driverClassName ).newInstance();

		} catch ( InstantiationException | IllegalAccessException | ClassNotFoundException e ) {

			throw new DatabaseException( e, "Fail to load JDBC Driver(@)", driverClassName );

		}
		
		registeredDriverClassNames.add( driverClassName );
		
	}
	
	/**
	 * 지정한 URL로 DB 연결을 시도한다.
	 * 
	 * @param url DB URL (<code>jdbc:<em>subprotocol</em>:<em>subname</em></code>)
	 * @return DB 연결객체
	 */
	public static Connection getConnection( String url ) {
		try {
			return java.sql.DriverManager.getConnection( url );
		} catch (SQLException e) {
			throw new DatabaseException( e, "Fail to get connection (URL:@)", url );
		}
	}

	/**
	 * 지정한 URL로 DB 연결을 시도한다.
	 * 
	 * @param url      DB URL (<code>jdbc:<em>subprotocol</em>:<em>subname</em></code>)
	 * @param id       DB 사용자 ID
	 * @param password DB 사용자 PASSWORD
	 * @return DB 연결객체
	 */
	public static Connection getConnection( String url, String id, String password ) {
		try {
			return java.sql.DriverManager.getConnection( url, id, password );
		} catch (SQLException e) {
			throw new DatabaseException( e, "Fail to get connection (URL:@, ID:@, PW:@)", url, id, password );
		}
	}

	
	
}
